package com.ruoyi.system.service.impl;

import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.domain.SysNoticeTable;
import com.ruoyi.system.domain.dto.SysNoticeListInput;
import com.ruoyi.system.domain.dto.SysNoticeListView;
import com.ruoyi.system.domain.dto.SysNoticeSaveInput;
import com.ruoyi.system.domain.dto.SysNoticeUpdateInput;
import com.ruoyi.system.service.ISysNoticeService;
import lombok.RequiredArgsConstructor;
import org.babyfish.jimmer.Page;
import org.babyfish.jimmer.sql.JSqlClient;
import org.babyfish.jimmer.sql.ast.mutation.SaveMode;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * 公告 服务层实现
 *
 * @author ruoyi
 */

@Service
@RequiredArgsConstructor
public class SysNoticeServiceImpl implements ISysNoticeService {

    private final JSqlClient sqlClient;

    /**
     * 查询公告信息
     *
     * @param noticeId 公告ID
     * @return 公告信息
     */
    @Override
    public SysNotice selectNoticeById(String noticeId) {
        return sqlClient.findById(SysNotice.class, noticeId);
    }


    /**
     * 查询公告列表
     *
     * @param notice 公告信息
     * @return 公告集合
     */
    @Override
    public List<SysNoticeListView> selectNoticeList(SysNoticeListInput notice) {
        SysNoticeTable table = SysNoticeTable.$;
        return sqlClient.createQuery(table)
                .where(
                        table.noticeTitle().ilikeIf(notice.getNoticeTitle()),
                        table.noticeType().eqIf(notice.getNoticeType()),
                        table.asTableEx().createBy().userName()
                                .ilikeIf(notice.getCreateBy())
                ).select(table.fetch(SysNoticeListView.class))
                .execute();
    }

    /**
     * 新增公告
     *
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    public int insertNotice(SysNoticeSaveInput notice) {
        return sqlClient.saveCommand(notice)
                .setMode(SaveMode.INSERT_ONLY)
                .execute().getTotalAffectedRowCount();
    }

    /**
     * 修改公告
     *
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    public int updateNotice(SysNoticeUpdateInput notice) {
        return sqlClient.saveCommand(notice)
                .setMode(SaveMode.UPDATE_ONLY)
                .execute().getTotalAffectedRowCount();
    }

    /**
     * 删除公告对象
     *
     * @param noticeId 公告ID
     * @return 结果
     */

    @Override
    public int deleteNoticeById(String noticeId) {
        return sqlClient.deleteById(SysNotice.class, noticeId)
                .getTotalAffectedRowCount();
    }

    /**
     * 批量删除公告信息
     *
     * @param noticeIds 需要删除的公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeByIds(String[] noticeIds) {
        return sqlClient.deleteByIds(SysNotice.class, Arrays.asList(noticeIds))
                .getTotalAffectedRowCount();
    }

    @Override
    public Page<SysNoticeListView> selectNoticePage(SysNoticeListInput notice, PageQuery pageQuery) {
        SysNoticeTable table = SysNoticeTable.$;
        return sqlClient.createQuery(table)
                .where(
                        table.noticeTitle().ilikeIf(notice.getNoticeTitle()),
                        table.noticeType().eqIf(notice.getNoticeType()),
                        table.asTableEx().createBy().userName()
                                .ilikeIf(notice.getCreateBy())
                ).select(table.fetch(SysNoticeListView.class))
                .fetchPage(pageQuery.getPageNum(), pageQuery.getPageSize());
    }
}
